//
//  ClosedCycleOfReference.swift
//  Swift_base_grammar
//
//  Created by lantaiyuan on 2017/9/14.
//  Copyright © 2017年 lantaiyuan. All rights reserved.
//  闭包循环引用

import Foundation
import UIKit

#if define
    /// 解决闭包的循环引用问题 --- 方法1
    func CircularReference() {
        // weak 属性在运行时可能会被改变 -> 执行对象一旦被释放，变成 nil
        // weak 属性不能是 let
        weak var weakSelf = self
        loadData2 { (html) in
            print(html)
            // 闭包中，一定要使用 self.
            // weakSelf? 表示对象一旦被释放，不再访问其属性或者方法
            print(weakSelf?.view! as Any)
        }
    }
    
    /// [weak self] 解决循环引用
    func CircularReference2() {
        // 方法二：Swift 的方法1
        // [weak self] 表示闭包中的 self 都是 弱引用
        // 与 __weak 类似，如果 self 被释放，什么也不做，更安全
        loadData {
            [weak self] (html) ->() in
            print(html)
            // self? 表示对象一旦被释放，不再访问其属性或者方法
            print(self?.view as Any)
        }
    }
    
    /// [unowned self] 解决循环引用
    func CircularReference3() {
        
        // 方法三：Swift 的方法2
        // [unowned self] 表示闭包中的 self 都是 assign -> 如果 self 被释放，闭包中的 self 的地址不会修改
        // 与__unsafe_unretained类似，如果 self 被释放，同样会出现野指针
        loadData {
            [unowned self] (html) ->() in
            print(html)
            // self? 表示对象一旦被释放，不再访问其属性或者方法
            print(self.view)
        }
    }
#else

#endif


